package 剑指offer.demo3;
//https://www.nowcoder.com/practice/fc533c45b73a41b0b44ccba763f866ef?

/**
 * 定义一个虚拟头，和重复节点边界辅助，逐个查看原链表，删除重复区间
 */
public class 删除链表中重复的结点 {
    public ListNode deleteDuplication(ListNode pHead) {
        //合法性判断
        if (pHead == null){
            return null;
        }
        //head:虚拟一个节点把他的下一个连到头节点方便操作
        ListNode head = new ListNode(-1);
        head.next = pHead;
        //pre：开始重复节点的前一个节点
        ListNode pre = head;
        //last：最后重复的节点
        ListNode last = pre.next;
        while (last != null){
            //持续相等和持续不想等的情况都会出现，所以两种情况都需要while进行持续处理
            while (last.next != null && last.next.val != last.val){
                last = last.next;
                pre = pre.next;
            }
            while (last.next != null && last.next.val == last.val){
                last = last.next;
            }
            //两个while走完说明
            // 1、last.next空了但是好(pre,last]是重复元素
            // 2、last.next空了但是pre.next=last说明整个区间只有一个元素即没有重复
            // 3、last.next不空此时(pre,last]肯定限制了重复元素
            if (pre.next != last){
                //这俩不相等只要去重就好了
                pre.next = last.next;
            }
            last = last.next;
        }
        return head.next;
    }

    //题目给定链表
    public class ListNode {
        int val;
        ListNode next = null;

        ListNode(int val) {
            this.val = val;
        }
    }
}
